#include<bits/stdc++.h>
using namespace std;
inline long long read(){
	long long ret=0,neg=1;
	char c=(char)getchar();
	while(c!='-'&&isdigit(c)==false) c=(char)getchar();
	if(c=='-'){
		neg=-1;
		c=(char)getchar();
	}
	while(isdigit(c)){
		ret=ret*10+c-'0';
		c=(char)getchar();
	}
	return ret*neg;
}
void write(long long x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>=10) write(x/10);
	putchar((x%10)+'0');
}

int ans[1000010];
int n;

namespace Protogen{
	vector<int> G0[1000010],G1[1000010],nG[1000010];
	int stk[1000010],tp;
	int in_stk[1000010];
	int dfn[1000010],low[1000010];
	int idx,sidx;
	int blg[1000010];

	int out_deg[1000010];
	int ret[1000010];

	void Reset(int n){
		for(int i=0;i<=n;++i){
			ans[i]=0;
			G0[i].clear();
			G0[i].shrink_to_fit();
			G1[i].clear();
			G1[i].shrink_to_fit();
			nG[i].clear();
			nG[i].shrink_to_fit();
			dfn[i]=0;
			out_deg[i]=0;
			ret[i]=0;
		}
	}
	void Add_0e(int x,int y){
		G0[x].emplace_back(y);
		// cout<<"0 "<<x<<' '<<y<<endl;
	}
	void Add_1e(int x,int y){
		G1[x].emplace_back(y);
		// cout<<"1 "<<x<<' '<<y<<endl;
	}


	void Tarjan(int u){
		dfn[u]=low[u]=++idx;
		stk[++tp]=u;
		in_stk[u]=1;
		for(auto v:G0[u]){
			if(dfn[v]==0){
				Tarjan(v);
				low[u]=min(low[u],low[v]);
			}
			else{
				if(in_stk[v]){
					low[u]=min(low[u],dfn[v]);
				}
			}
		}
		if(low[u]==dfn[u]){
			++sidx;
			while(1){
				bool flg=false;
				if(stk[tp]==u) flg=true;
				in_stk[stk[tp]]=0;
				blg[stk[tp]]=sidx;
				--tp;
				if(flg) break;
			}
		}
	}
	int Solve(){
		idx=sidx=0;
		for(int i=0;i<n;++i){
			if(dfn[i]==0){
				Tarjan(i);
			}
		}
		for(int u=0;u<n;++u){
			for(auto v:G0[u]){
				if(blg[v]!=blg[u]){
					nG[blg[v]].emplace_back(blg[u]);
					++out_deg[blg[u]];
				}
			}
			for(auto v:G1[u]){
				nG[blg[v]].emplace_back(-blg[u]);
				++out_deg[blg[u]];
			}
		}
		queue<int> q;
		for(int i=1;i<=sidx;++i){
			if(out_deg[i]==0){
				q.push(i);
			}
		}
		int cnt=0;
		while(q.empty()==false){
			int u=q.front();
			q.pop();
			if(ret[u]>=26) return 0;
			++cnt;
			for(auto v:nG[u]){
				int vv=v;
				if(vv<0){
					vv=-vv;
					ret[vv]=max(ret[vv],ret[u]+1);
				}
				else{
					ret[vv]=max(ret[vv],ret[u]);
				}
				out_deg[abs(v)]--;
				if(out_deg[abs(v)]==0) q.push(abs(v));
			}
		}
		if(cnt!=sidx) return 0;
		for(int i=0;i<n;++i){
			ans[i]=ret[blg[i]];
		}
		return 1;
	}
}

int p[1000010],pos[1000010];
int palin[2000010];


int main(){
	freopen("string.in","r",stdin);
	freopen("string.out","w",stdout);
	int TTT=read();
	while(TTT--){
		n=read();
		for(int i=0;i<n;++i){
			p[i]=read();
			pos[p[i]]=i;
		}
		pos[n]=-1;
		Protogen::Reset(n);
		for(int i=1;i<n;++i){
			if(pos[p[i-1]+1]<pos[p[i]+1]){
				Protogen::Add_0e(p[i],p[i-1]);
			}
			else{
				Protogen::Add_1e(p[i],p[i-1]);
			}
		}
		bool flag=true;
		int mx=-1,mxp=-1;
		for(int i=0;i<n+n-1;++i){
			palin[i]=read();
			// if(i&1){
			// 	palin[i]=palin[i]+1;
			// }
			// else{
			// 	if()
			// 	palin[i]=palin[i]+1;
			// }
			if(palin[i]==0){
				palin[i]=1;
			}
			else{
				int ll,rr;
				if(i&1){
					ll=(i>>1)-palin[i]/2+1;
					rr=(i>>1)+palin[i]/2;
				}
				else{
					ll=(i>>1)-(palin[i]>>1);
					rr=(i>>1)+(palin[i]>>1);
				}
				if(ll<0||rr>=n){
					flag=false;
					continue;
				}
				ll*=2;
				rr*=2;
				if(ll>0&&rr<n+n-2){
					--ll;
					++rr;
				}
				palin[i]=(rr-ll+1+1)>>1;
			}
			if(flag==false) continue;
			int curp=1;
			if(curp+i-1<=mx){
				curp=min(palin[mxp+mxp-i],mx-i+1);
			}
			if(curp>palin[i]){
				flag=false;
				// cout<<"!!";
				continue;
			}
			while(curp<palin[i]){
				++curp;
				if((i+curp-1)>=n+n-1||(i-curp+1)<0){
					flag=false;
					break;
				}
				if((i+curp-1)&1==0){
					Protogen::Add_0e((i+curp-1)/2,(i-curp+1)/2);
					Protogen::Add_0e((i-curp+1)/2,(i+curp-1)/2);
				}
			}
			if(flag==false) continue;
			int l,r;
			l=(i-curp);
			r=(i+curp);
			if(l>=0&&r<n+n-1){
				l/=2;
				r/=2;
				if(pos[l]<pos[r]){
					Protogen::Add_1e(r,l);
				}
				else{
					Protogen::Add_1e(l,r);
				}
			}
			if(i+curp-1>mx){
				mx=i+curp-1;
				mxp=i;
			}
		}
		if(!flag){
			write(-1);
			putchar('\n');
			continue;
		}
		if(Protogen::Solve()==0){
			write(-1);
			putchar('\n');
		}
		else{
			for(int i=0;i<n;++i){
				putchar('a'+ans[i]);
			}
			putchar('\n');
		}
	}

	return 0;
}